package com.demo;

import com.demo.util.CamelUtils;
import freemarker.cache.FileTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Stream;

/**
 * 实体 输入dto生成
 * @author gy
 * @date 2023/8/24
 */
public class EntityInputDTOGenerator {

    private static final String tableName = "t_hardware_server_manage";
//    private static final String tableName = "t_sample_manage";
//    private static final String tableName = "t_audit_event";

    private static final String inputPackagePath="D:\\generator\\src\\main\\java\\com\\sinoits\\" +
            "microservicehlyy\\dto\\input\\";
    private static final String entityPackagePath="D:\\generator\\src\\main\\java\\com\\sinoits\\" +
            "microservicehlyy\\test\\entity\\";
    private static final String entityInputDTOSuffix="InputDTO";
    private static final String fileType = ".java";

    private static final String tableNamePrefix = "t_";
    private static final String entityName =
            CamelUtils.line2upperCamel(tableName.replace(tableNamePrefix,""));

    // 生成InputDTO
    @Test
    public void generatorInputDTO() throws IOException {
        long startTime = System.currentTimeMillis();

        String fileName = entityPackagePath+entityName+fileType;

        // 读取文件内容到Stream流中，按行读取
        Stream<String> lines = Files.lines(Paths.get(fileName));

        System.out.println("-----------------生成 EntityInputDTO 开始-----------------------");

        File file = new File(inputPackagePath+entityName+entityInputDTOSuffix+fileType);
        // 如果存在，就删除旧的文件，保证是最新生成的文件
        if (file.exists()) {
            file.delete();
        }

        // forEach获取Stream流中的行数据不能保证顺序，但速度快。
        // 如果你想按顺序去处理文件中的行数据，可以使用forEachOrdered，但处理效率会下降
        lines.forEachOrdered(ele -> {
            ele = ele.replace("class "+entityName,"class "+entityName+entityInputDTOSuffix);
            if (!ele.contains("TableName") && !ele.contains("TableId") && !ele.contains("IdType")){
                try {
                    fileWriterMethod(
                            inputPackagePath + entityName + entityInputDTOSuffix + fileType, ele);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
//            System.out.println(ele); //查看更改后的内容
        });

        long endTime = System.currentTimeMillis();
        System.out.println("***EntityInputDTO文件位置："+inputPackagePath+entityName+entityInputDTOSuffix+fileType);
        System.out.println("-----------------生成 EntityInputDTO 结束-----------------------");

        System.out.println("执行耗时["+(endTime - startTime)+"]毫秒");
    }


    /**
     * 方法 1：使用 FileWriter 写文件
     * @param filepath 文件目录
     * @param content  待写入内容
     * @throws IOException
     */
    public static void fileWriterMethod(String filepath, String content) throws IOException {
        try (FileWriter fileWriter = new FileWriter(filepath,true)) {
            fileWriter.append(content).append("\n");
        }
    }

}
